#ifndef _NET_COMM_H
#define _NET_COMM_H

#include <linux/skbuff.h>
#include <linux/net.h>
#include <linux/hashtable.h>
#include <linux/module.h>
#include <net/sock.h>
#include <linux/mutex.h>

#include <linux/socket.h>
#define COMM__MAX	14

struct sockaddr_comm {
    __kernel_sa_family_t comm_family;//需为AF_COMM
    char comm_name[COMM__MAX];//名称
};

//每个协议域有自定义的sock结构体 但是必须将sk作为第一个成员
struct comm_sock{
    struct sock        sk;        // 继承 sock 结构,必须是第一个成员变量
    struct hlist_node  node;      // 哈希表节点
    char               name[COMM__MAX]; // 绑定的名称
    struct sk_buff_head recv_queue; // 接收队列
    spinlock_t lock;
};

static inline struct comm_sock *comm_sk(const struct sock *sk)
{
	return (struct comm_sock *)sk;
};

//#define comm_sk(__sk) ((struct comm_sock *)__sk)

//全局Hash管理名字到soc(存储广播消息)ket的映射表以及锁
//2^8个桶 每个桶都是链表头 存相同hash值的元素
static DEFINE_HASHTABLE(comm_table, 8);
static DEFINE_RWLOCK(comm_table_lock);
#endif